---
title:  SELECT Statement
---

<!--
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements.  See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License.  You may obtain a copy of the License at

     http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->

The SELECT statement allows you to filter data from the collection of object(s) returned by a WHERE search operation. The projection list is either specified as \* or as a comma delimited list of expressions.

For \*, the interim results of the WHERE clause are returned from the query.

**Examples:**

Query all objects from the region using \*. Returns the Collection of portfolios (The exampleRegion contains Portfolio as values).

``` pre
SELECT * FROM /exampleRegion
```

Query secIds from positions. Returns the Collection of secIds from the positions of active portfolios:

``` pre
SELECT secId FROM /exampleRegion, positions.values TYPE Position 
WHERE status = 'active'
```

Returns a Collection of struct&lt;type: String, positions: map&gt; for the active portfolios. The second field of the struct is a Map ( jav.utils.Map ) object, which contains the positions map as the value:

``` pre
SELECT "type", positions FROM /exampleRegion 
WHERE status = 'active'
```

Returns a Collection of struct&lt;portfolios: Portfolio, values: Position&gt; for the active portfolios:

``` pre
SELECT * FROM /exampleRegion, positions.values 
TYPE Position WHERE status = 'active'
```

Returns a Collection of struct&lt;pflo: Portfolio, posn: Position&gt; for the active portfolios:

``` pre
SELECT * FROM /exampleRegion portfolio, positions positions 
TYPE Position WHERE portfolio.status = 'active'
```

## <a id="concept_85AE7D6B1E2941ED8BD2A8310A81753E__section_1B7762EC686A4808B1D12E8851954E82" class="no-quick-link"></a>SELECT Statement Results

The result of a SELECT statement is either UNDEFINED or is a Collection that implements the [SelectResults](/releases/latest/javadoc/org/apache/geode/cache/query/SelectResults.html) interface.

The SelectResults returned from the SELECT statement is either:

1.  A collection of objects, returned for these two cases:
    -   When only one expression is specified by the projection list and that expression is not explicitly specified using the fieldname:expression syntax
    -   When the SELECT list is \* and a single collection is specified in the FROM clause

2.  A collection of Structs that contains the objects

When a struct is returned, the name of each field in the struct is determined following this order of preference:

1.  If a field is specified explicitly using the fieldname:expression syntax, the fieldname is used.
2.  If the SELECT projection list is \* and an explicit iterator expression is used in the FROM clause, the iterator variable name is used as the field name.
3.  If the field is associated with a region or attribute path, the last attribute name in the path is used.
4.  If names cannot be decided based on these rules, arbitrary unique names are generated by the query processor.

## <a id="concept_85AE7D6B1E2941ED8BD2A8310A81753E__section_972EE73A6F3E4427B6A99DB4EDF5860D" class="no-quick-link"></a>DISTINCT

Use the DISTINCT keyword if you want to limit the results set to unique rows. Note that in the current version of Geode you are no longer required to use the DISTINCT keyword in your SELECT statement.

``` pre
SELECT DISTINCT * FROM /exampleRegion
```

**Note:**
If you are using DISTINCT queries, you must implement the equals and hashCode methods for the objects that you query.

## <a id="concept_85AE7D6B1E2941ED8BD2A8310A81753E__section_25D7055B33EC47B19B1B70264B39212F" class="no-quick-link"></a>LIMIT

You can use the LIMIT keyword at the end of the query string to limit the number of values returned.

For example, this query returns at most 10 values:

``` pre
SELECT * FROM /exampleRegion LIMIT 10
```

## <a id="concept_85AE7D6B1E2941ED8BD2A8310A81753E__section_D9DF0F785CA94EF8B367C3326CC12990" class="no-quick-link"></a>ORDER BY

You can order your query results in ascending or descending order by using the ORDER BY clause. You must use DISTINCT when you write ORDER BY queries.

``` pre
SELECT DISTINCT * FROM /exampleRegion WHERE ID < 101 ORDER BY ID
```

The following query sorts the results in ascending order:

``` pre
SELECT DISTINCT * FROM /exampleRegion WHERE ID < 101 ORDER BY ID asc
```

The following query sorts the results in descending order:

``` pre
SELECT DISTINCT * FROM /exampleRegion WHERE ID < 101 ORDER BY ID desc
```

**Note:**
If you are using ORDER BY queries, you must implement the equals and hashCode methods for the objects that you query.

## <a id="concept_85AE7D6B1E2941ED8BD2A8310A81753E__section_69DCAD624E9640028BC86FD67649DEB2" class="no-quick-link"></a>Preset Query Functions

Geode provides several built-in functions for evaluating or filtering data returned from a query. They include the following:

<table>
<colgroup>
<col width="33%" />
<col width="33%" />
<col width="33%" />
</colgroup>
<thead>
<tr class="header">
<th>Function</th>
<th>Description</th>
<th>Example</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td>ELEMENT(expr)</td>
<td>Extracts a single element from a collection or array. This function throws a <code class="ph codeph">FunctionDomainException</code> if the argument is not a collection or array with exactly one element.</td>
<td><pre class="pre codeblock"><code>ELEMENT(SELECT DISTINCT * 
 FROM /exampleRegion 
 WHERE id = &#39;XYZ-1&#39;).status = &#39;active&#39;</code></pre></td>
</tr>
<tr class="even">
<td>IS_DEFINED(expr)</td>
<td>Returns TRUE if the expression does not evaluate to UNDEFINED.</td>
<td><pre class="pre codeblock"><code>IS_DEFINED(SELECT DISTINCT * 
FROM /exampleRegion p 
WHERE p.status = &#39;active&#39;)</code></pre></td>
</tr>
<tr class="odd">
<td>IS_UNDEFINED (expr)</td>
<td>Returns TRUE if the expression evaluates to UNDEFINED. In most queries, undefined values are not included in the query results. The IS_UNDEFINED function allows undefined values to be included, so you can identify element with undefined values.</td>
<td><pre class="pre codeblock"><code>SELECT DISTINCT * 
FROM /exampleRegion p 
WHERE IS_UNDEFINED(p.status)</code></pre></td>
</tr>
<tr class="even">
<td>NVL(expr1, expr2)</td>
<td>Returns expr2 if expr1 is null. The expressions can be query parameters (bind arguments), path expressions, or literals.</td>
<td> </td>
</tr>
<tr class="odd">
<td>TO_DATE(date_str, format_str)</td>
<td>Returns a Java Data class object. The arguments must be String S with date_str representing the date and format_str representing the format used by date_str. The format_str you provide is parsed using java.text.SimpleDateFormat.</td>
<td> </td>
</tr>
</tbody>
</table>

## <a id="concept_85AE7D6B1E2941ED8BD2A8310A81753E__section_B2CBA00EB83F463DAF4769D7859C64C8" class="no-quick-link"></a>COUNT

The COUNT keyword returns the number of results that match the query selection conditions specified in the WHERE clause. Using COUNT allows you to determine the size of a results set. The COUNT statement always returns an integer as its result.

The following queries are example COUNT queries that return region entries:

``` pre
SELECT COUNT(*) FROM /exampleRegion
```

``` pre
SELECT COUNT(*) FROM /exampleRegion WHERE ID > 0
```

``` pre
SELECT COUNT(*) FROM /exampleRegion WHERE ID > 0 LIMIT 50
```

``` pre
SELECT COUNT(*) FROM /exampleRegion 
WHERE ID >0 AND status LIKE 'act%'
```

``` pre
SELECT COUNT(*) FROM /exampleRegion 
WHERE ID IN SET(1,2,3,4,5)
```

The following COUNT query returns the total number of StructTypes that match the query's selection criteria.

``` pre
SELECT COUNT(*) 
FROM /exampleRegion p, p.positions.values pos 
WHERE p.ID > 0 AND pos.secId 'IBM'
```

The following COUNT query uses the DISTINCT keyword and eliminates duplicates from the number of results.

``` pre
SELECT DISTINCT COUNT(*)
FROM /exampleRegion p, p.positions.values pos
WHERE p.ID > 0 OR p.status = 'active' OR pos.secId
OR pos.secId = 'IBM'
```
